﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

namespace Acoris.Note
{
    using Acoris.Utils;
    using Acoris.Note.Core;
    using Windows.Storage;
    using Windows.UI.Xaml.Markup;
    using Windows.UI.Xaml.Resources;
    using Windows.UI;
    using Windows.ApplicationModel.Core;
    using Windows.UI.ViewManagement;
    //using Windows.UI.ViewManagement.Core;


    /// <summary>
    /// 提供特定于应用程序的行为，以补充默认的应用程序类。
    /// </summary>
    sealed partial class App : Application
    {
        /// <summary>
        /// 初始化单一实例应用程序对象。这是执行的创作代码的第一行，
        /// 已执行，逻辑上等同于 main() 或 WinMain()。
        /// </summary>
        public App()
        {
            this.InitializeComponent();
            this.Suspending += OnSuspending;
        }

        /// <summary>
        /// 在应用程序由最终用户正常启动时进行调用。
        /// 将在启动应用程序以打开特定文件等情况下使用。
        /// </summary>
        /// <param name="e">有关启动请求和过程的详细信息。</param>
        protected override void OnLaunched(LaunchActivatedEventArgs e)
        {
            Frame rootFrame = Window.Current.Content as Frame;
            LoadThemeResource();
            // 不要在窗口已包含内容时重复应用程序初始化，
            // 只需确保窗口处于活动状态
            if (rootFrame == null)
            {
                // 创建要充当导航上下文的框架，并导航到第一页
                rootFrame = new Frame();

                rootFrame.NavigationFailed += OnNavigationFailed;

                if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    //TODO: 从之前挂起的应用程序加载状态
                }

                // 将框架放在当前窗口中
                Window.Current.Content = rootFrame;
            }

            if (e.PrelaunchActivated == false)
            {
                if (rootFrame.Content == null)
                {
                    // 当导航堆栈尚未还原时，导航到第一页，
                    // 并通过将所需信息作为导航参数传入来配置
                    // 参数
                    rootFrame.Navigate(typeof(MainPage), e.Arguments);
                }
                // 确保当前窗口处于活动状态
                Window.Current.Activate();
            }                       
        }

        /// <summary>
        /// 导航到特定页失败时调用
        /// </summary>
        ///<param name="sender">导航失败的框架</param>
        ///<param name="e">有关导航失败的详细信息</param>
        void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
        }

        /// <summary>
        /// 在将要挂起应用程序执行时调用。  在不知道应用程序
        /// 无需知道应用程序会被终止还是会恢复，
        /// 并让内存内容保持不变。
        /// </summary>
        /// <param name="sender">挂起的请求的源。</param>
        /// <param name="e">有关挂起请求的详细信息。</param>
        private void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();
            //TODO: 保存应用程序状态并停止任何后台活动
            deferral.Complete();
        }
    }

    sealed partial class App
    {
        static FrameworkElement _titleBarElement;


        //---------------------------------------------------------------------------------------------------
        //  资源命名方式
        //  关键字+ThemeResource.xaml
        //  必须放在Assets目录之中
        //---------------------------------------------------------------------------------------------------

        private void LoadThemeResource()
        {
            // 创建沉浸式UI
            var view = CoreApplication.GetCurrentView();
            var titleBar = view.TitleBar;
            titleBar.ExtendViewIntoTitleBar = true;
            titleBar.LayoutMetricsChanged += OnViewLayoutMetricsChanged;

            // 加载主题资源
            var setting = ApplicationData.Current.LocalSettings;
            if (!setting.Values.ContainsKey("theme")) {
                setting.Values["theme"] = "Light";
            }
            else {
                setting.Values["theme"] = "Light";
            }
            var theme = setting.Values["theme"].ToString();
            var resourceDictionary = GetThemeResource(theme);

            // 设置标题栏按钮样式
            var viewTitleBar = ApplicationView.GetForCurrentView().TitleBar;
            viewTitleBar.ButtonBackgroundColor = ((SolidColorBrush)resourceDictionary["SystemButton.Background"]).Color;
            viewTitleBar.ButtonForegroundColor = ((SolidColorBrush)resourceDictionary["SystemButton.Foreground"]).Color;


            viewTitleBar.ButtonHoverBackgroundColor = ((SolidColorBrush)resourceDictionary["SystemButton.MouseOver.Background"]).Color;
            viewTitleBar.ButtonHoverForegroundColor = ((SolidColorBrush)resourceDictionary["SystemButton.MouseOver.Foreground"]).Color;

            viewTitleBar.ButtonPressedBackgroundColor = ((SolidColorBrush)resourceDictionary["SystemButton.Pressed.Background"]).Color;
            viewTitleBar.ButtonPressedForegroundColor = ((SolidColorBrush)resourceDictionary["SystemButton.Pressed.Foreground"]).Color;

            viewTitleBar.ButtonInactiveBackgroundColor = ((SolidColorBrush)resourceDictionary["SystemButton.Inactive.Background"]).Color;
            viewTitleBar.ButtonInactiveForegroundColor = ((SolidColorBrush)resourceDictionary["SystemButton.Inactive.Foreground"]).Color;

            CustomXamlResourceLoader.Current = new AcorisNoteXAMLResourceLoader(resourceDictionary);
        }

        private void OnViewLayoutMetricsChanged(CoreApplicationViewTitleBar sender, object args)
        {
            if(_titleBarElement != null) {                
                ((FrameworkElement)_titleBarElement.Parent).Margin = new Thickness(
                    sender.SystemOverlayLeftInset,0,
                    sender.SystemOverlayRightInset,
                    0
                    );
            }
        }

        private ResourceDictionary GetThemeResource(string themeName)
        {
            if (string.IsNullOrEmpty(themeName)) {
                return new ResourceDictionary
                {
                    Source = new Uri(@"ms-appx:///Assets/DarkThemeResource.xaml", UriKind.Absolute)
                };
            }
            return new ResourceDictionary
            {
                Source = new Uri(@"ms-appx:///Assets/" + themeName + "ThemeResource.xaml", UriKind.Absolute)
            };
        }

        public static void SetTitle(string title)
        {
            var viewTitleBar = ApplicationView.GetForCurrentView();
            viewTitleBar.Title = title;
        }

        public static void SetTitleBar(UIElement titleBar)
        {
            // 创建沉浸式UI
            var view = CoreApplication.GetCurrentView();
            var appTitleBar = view.TitleBar;
            _titleBarElement = titleBar as FrameworkElement;
            Window.Current.SetTitleBar(titleBar);
        }
    }
}
